#ifndef CAI_H
#define CAI_H

/**
 * @brief 用于存储对话上下文，用于多轮对话
 */
struct cai_convo;

/**
 * @brief 新建对话
 * 
 * @param prompt 系统提示词，NULL为不使用
 * @param max 对话保存的最多消息数，0为不限制
 * @return struct cai_convo* 成功返回对话结构体地址，失败返回NULL
 */
struct cai_convo* cai_convo_create(const char* prompt, int max);

/**
 * @brief 删除对话
 * 
 * @param convo 对话结构体地址
 */
void cai_convo_destroy(struct cai_convo* convo);

/**
 * @brief 从文件中加载对话上下文
 * 
 * @param file 保存对话上下文的文件路径
 * @return struct cai_convo* 成功返回对话结构体地址，失败返回NULL
 */
struct cai_convo* cai_convo_load(const char* file);

/**
 * @brief 将对话上下文保存到文件中
 * 
 * @param convo 对话结构体地址
 * @param file 保存对话上下文的文件路径
 * @return int 成功返回0，失败返回-1
 */
int cai_convo_save(struct cai_convo* convo, const char* file);

/**
 * @brief 用于存储AI助手信息
 */
struct cai_asst;

/**
 * @brief 创建AI助手
 * 
 * @param api_key API认证密钥
 * @param base_url API服务地址
 * @param model 模型名称
 * @return struct cai_asst* 成功返回AI助手结构体地址，失败返回NULL
 */
struct cai_asst* cai_asst_create(const char* api_key, const char* base_url, const char* model);

/**
 * @brief 设置温度参数
 * 
 * @param asst AI助手结构体地址
 * @param temperature 温度参数
 */
void cai_asst_set_temperature(struct cai_asst* asst, float temperature);

/**
 * @brief 设置输出格式
 * 
 * @param asst AI助手结构体地址
 * @param format 输出格式，如"json_object"、"text"等
 */
void cai_asst_set_format(struct cai_asst* asst, const char* format);

/**
 * @brief 删除AI助手
 * 
 * @param asst AI助手结构体地址
 */
void cai_asst_destroy(struct cai_asst* asst);

/**
 * @brief 流式响应回调函数原型
 * @param content 接收到的内容片段
 * @param reason  收到的推理内容
 * @param userdata 用户自定义数据指针
 */
typedef void (*cai_stream_callback)(void* userdata, char* content, char* reason);

/**
 * @brief 设置流式响应回调函数
 * 
 * @param asst AI助手结构体地址
 * @param callback 回调函数
 * @param userdata 用户自定义数据指针
 */
void cai_set_stream_callback(struct cai_asst* asst, cai_stream_callback callback, void* userdata);

/**
 * @brief 与AI助手对话
 * 
 * @param asst AI助手结构体地址
 * @param conv 对话结构体地址，如果为NULL，则不保存对话上下文
 * @param question 用户的问题
 * @param file 输入的文件，用于支持多模态的大模型，可以为NULL
 * @return char* 返回AI助手的回答，会自动释放
 */
char* cai_asst_chat(struct cai_asst* asst, 
                    struct cai_convo* conv, 
                    const char* question,
                    const char* file);

#endif
